package com.jlf.controller.engine.entity.domain;

import com.jlf.core.annotation.Domain;
import com.jlf.core.constant.Constants;
import com.jlf.core.engine.constant.SchemaConstant;
import com.jlf.core.engine.domain.SchemaDomainDO;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;

/**
 * 模型领域的新增编辑输入参数
 *
 * @author wujr
 * 2023/7/7
 * @version 1.0
 * 【变更历史】
 * [wujr 2023/7/7 1.0 新增]
 */
@Getter
@Setter
public class SchemaDomainInput {
    /**
     * 领域的编码，具有唯一性
     * 用于：注解：{@link Domain#code()}
     */
    @NotBlank(message = "模型领域编码不能为空")
    private String domainCode;
    /**
     * 领域名称
     * 用于：注解：{@link Domain#name()}
     */
    @NotBlank(message = "模型领域名称不能为空")
    private String domainName;
    /**
     * 该领域的数据表名称
     * 用于：注解：{@link Domain#table()}
     */
    private String domainTable;
    /**
     * 该模型的管理接口路径
     */
    private String restfulPath;
    /**
     * 领域的版本号
     */
    private Integer domainVersion = 1;
    @NotBlank(message = "模型领域的包路径不能为空")
    private String domainPackage;
    /**
     * 数据库，主键id的类型 {@link SchemaConstant.Jdbc.id}
     */
    @Min(value = 0, message = "不支持的主键类型")
    @Max(value = 3, message = "不支持的主键类型")
    private Integer dbIdType = SchemaConstant.Jdbc.id.snow;
    /**
     * 该领域的状态
     */
    @Min(value = 0, message = "不支持的模型状态")
    @Max(value = 1, message = "不支持的模型状态")
    private Integer status = Constants.Status.enabled;
    @NotNull(message = "排序不能为空")
    private Integer priority;
    /**
     * 是否需要对记录进行乐观锁
     */
    private Boolean optimisticLocker = Boolean.FALSE;
    /**
     * 事务标记 {@link SchemaConstant.Jdbc.Transaction}
     */
    private Integer transactionFlag = 0;

    public SchemaDomainDO to(){
        SchemaDomainDO record = new SchemaDomainDO();
        record.setDomainCode(domainCode);
        record.setDomainName(domainName);
        record.setDomainTable(domainTable);
        record.setDomainVersion(domainVersion);
        record.setDomainPackage(domainPackage);
        record.setRestfulPath(restfulPath);
        record.setDbIdType(dbIdType);
        record.setStatus(status);
        record.setPriority(priority);
        record.setOptimisticLocker(optimisticLocker);
        record.setTransactionFlag(transactionFlag);

        return record;
    }
}
